<!DOCTYPE html>
<html lang="en">

  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>02队列的封装</title>
  </head>
  <script>
    // 封装队列类
    function Queue() {
      // 属性
      this.items = []
      // 方法
      // 1.enqueue(element)：向队列尾部添加一个（或多个）新的项。
      Queue.prototype.enqueue = function(element) {
        return this.items.push(element)
      }
      // 2.dequeue()：移除队列的第一（即排在队列最前面的）项，并返回被移除的元素。
      Queue.prototype.dequeue = function() {
        return this.items.shift()
      }
      // 3.front()：返回队列中第一个元素——最先被添加，也将是最先被移除的元素。队列不做任何变动（不移除元素，只返回元素信息——与Stack类的peek方法非常类似）。
      Queue.prototype.front = function() {
        return this.items[0]
      }
      // 4.isEmpty()：如果队列中不包含任何元素，返回true，否则返回false。
      Queue.prototype.isEmpty = function() {
        return this.items.length == 0
      }
      // 5.size()：返回队列包含的元素个数，与数组的length属性类似。
      Queue.prototype.size = function() {
        return this.items.length
      }
      // 6.toString方法
      Queue.prototype.toString = function() {
        resultString = items.join() + ''
        return resultString
      }
      // 7.清空队列
      Queue.prototype.clear = function() {
        return this.items = []
      }

    }
    /*  // 创建队列对象
    let queue = new Queue
    // 在队列中添加元素
    queue.enqueue("abc")
    queue.enqueue("cba")
    queue.enqueue("nba")

    // 查看一下队列前端元素
    alert(queue.front())

    // 查看队列是否为空和元素个数
    alert(queue.isEmpty())
    alert(queue.size())

    // 从队列中删除元素
    alert(queue.dequeue())
    alert(queue.dequeue())
    alert(queue.dequeue())
*/

    // 面试题:击鼓传花
    function passGame(nameList, num) {
      // 1.创建一个队列, 并且将所有的人放在队列中
      // 1.1.创建队列
      let queue = new Queue()

      // 1.2.通过for循环, 将nameList中的人放在队列中
      for (let i = 0; i < nameList.length; i++) {
        queue.enqueue(nameList[i])
      }

      // 2.寻找最后剩下的人
      while (queue.size() > 1) {
        // 将前num-1中的人, 都从队列的前端取出放在队列的后端
        for (let i = 0; i < num; i++) {
          queue.enqueue(queue.dequeue())
        }

        // 将第num个人, 从队列中移除
        queue.dequeue()
      }

      // 3.获取剩下的一个人
      console.log(queue.size())
      let endName = queue.dequeue()
      console.log("最终留下来的人:" + endName)

      // 4.获取该人在队列中的位置
      return nameList.indexOf(endName)
    }

    // 测试击鼓传花
    // 验证结果
    let names = ['John', 'Jack', 'Camila', 'Ingrid', 'Carl'];
   console.log("最终位置:" + passGame(names, 7) )  // 数到8的人淘汰
  </script>

  <body>

  </body>

</html>
